<?php
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Category;
use App\Models\Tag;
use App\Models\Article;
use App\Models\Comment;
use App\Models\Photo;
use App\Models\Message;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     * 填充测试数据，包括用户、分类、标签、文章、评论、相册和留言。
     */
    public function run()
    {
        // 调用用户种子文件
        $this->call([
            UserSeeder::class,
        ]);

        // 获取管理员用户
        $admin = User::where('name', 'admin')->first();

        // 创建5个分类
        $categories = [
            Category::create([
                'name' => '技术分享',
                'slug' => 'tech',
                'description' => '分享最新技术、编程经验和开发技巧。',
            ]),
            Category::create([
                'name' => '生活随笔',
                'slug' => 'life',
                'description' => '记录生活点滴、感悟与随想。',
            ]),
            Category::create([
                'name' => '学习笔记',
                'slug' => 'study',
                'description' => '学习过程中的笔记、总结与心得。',
            ]),
            Category::create([
                'name' => '项目展示',
                'slug' => 'project',
                'description' => '个人或团队项目的展示与介绍。',
            ]),
            Category::create([
                'name' => '心得体会',
                'slug' => 'experience',
                'description' => '各类经验、体会与成长故事。',
            ]),
        ];

        // 创建8个标签
        $tags = [
            Tag::create(['name' => 'Laravel', 'slug' => 'laravel']),
            Tag::create(['name' => 'Vue.js', 'slug' => 'vue']),
            Tag::create(['name' => 'PHP', 'slug' => 'php']),
            Tag::create(['name' => 'JavaScript', 'slug' => 'javascript']),
            Tag::create(['name' => 'MySQL', 'slug' => 'mysql']),
            Tag::create(['name' => 'CSS', 'slug' => 'css']),
            Tag::create(['name' => 'Git', 'slug' => 'git']),
            Tag::create(['name' => 'Docker', 'slug' => 'docker']),
        ];

        // 创建10篇文章（包含新字段）
        $articles = [
            [
                'title' => 'Laravel 10 新特性详解',
                'slug' => 'laravel-10-features',
                'content' => 'Laravel 10 带来了许多令人兴奋的新特性，包括更快的性能、更好的类型提示支持等。本文将详细介绍这些新功能。

## 主要新特性

### 1. 性能提升
Laravel 10 在性能方面有了显著提升，特别是在路由缓存和视图编译方面。

### 2. 类型提示改进
PHP 8.1+ 的类型提示支持更加完善，提供了更好的开发体验。

### 3. 新的 Artisan 命令
新增了多个实用的 Artisan 命令，提高了开发效率。

## 总结
Laravel 10 是一个重要的版本更新，值得升级使用。',
                'summary' => '探索 Laravel 10 的新特性和改进，包括性能提升、类型提示改进和新的 Artisan 命令。',
                'cover' => 'storage/covers/laravel-10.jpg',
                'category_id' => 1,
                'tags' => [1, 3], // Laravel, PHP
                'status' => 'published',
                'is_top' => true,
                'seo_title' => 'Laravel 10 新特性详解 - 技术分享',
                'seo_description' => '详细介绍 Laravel 10 的新特性，包括性能提升、类型提示改进和新的 Artisan 命令。',
                'seo_keywords' => 'Laravel 10, PHP, 新特性, 性能提升, 类型提示',
            ],
            [
                'title' => 'Vue 3 Composition API 实战指南',
                'slug' => 'vue3-composition-api',
                'content' => 'Vue 3 的 Composition API 为组件逻辑提供了更好的组织方式。本文将通过实际案例来学习如何使用。

## Composition API 的优势

### 1. 更好的逻辑复用
Composition API 使得逻辑复用变得更加简单和灵活。

### 2. 更好的类型推导
TypeScript 支持更加完善，提供了更好的开发体验。

### 3. 更小的打包体积
Tree-shaking 支持更好，最终打包体积更小。

## 实战案例
通过一个完整的 Todo 应用来演示 Composition API 的使用。',
                'summary' => '学习 Vue 3 Composition API 的使用方法，通过实战案例掌握其核心概念和最佳实践。',
                'cover' => 'storage/covers/vue3-composition.jpg',
                'category_id' => 1,
                'tags' => [2, 4], // Vue.js, JavaScript
                'status' => 'published',
                'is_top' => false,
                'seo_title' => 'Vue 3 Composition API 实战指南 - 前端开发',
                'seo_description' => '通过实战案例学习 Vue 3 Composition API 的使用方法，掌握其核心概念和最佳实践。',
                'seo_keywords' => 'Vue 3, Composition API, JavaScript, 前端开发, 组件',
            ],
            [
                'title' => 'MySQL 性能优化技巧',
                'slug' => 'mysql-performance',
                'content' => '数据库性能对应用的整体表现至关重要。本文将分享一些 MySQL 性能优化的实用技巧。

## 索引优化
合理的索引设计是提升查询性能的关键。

## 查询优化
避免常见的查询陷阱，如 SELECT * 和 N+1 查询问题。

## 配置优化
调整 MySQL 配置参数以提升整体性能。',
                'summary' => '提升 MySQL 数据库性能的实用技巧，包括索引优化、查询优化和配置优化。',
                'cover' => 'storage/covers/mysql-performance.jpg',
                'category_id' => 3,
                'tags' => [5], // MySQL
                'status' => 'published',
                'is_top' => false,
                'seo_title' => 'MySQL 性能优化技巧 - 数据库优化',
                'seo_description' => '分享 MySQL 数据库性能优化的实用技巧，包括索引优化、查询优化和配置优化。',
                'seo_keywords' => 'MySQL, 性能优化, 数据库, 索引优化, 查询优化',
            ],
            [
                'title' => 'Git 工作流程最佳实践',
                'slug' => 'git-workflow',
                'content' => '良好的 Git 工作流程可以提高团队协作效率。本文介绍几种常用的 Git 工作流程。

## Git Flow
适合大型项目的 Git 工作流程。

## GitHub Flow
适合小型项目的简化工作流程。

## 分支命名规范
统一的分支命名规范有助于团队协作。',
                'summary' => '团队协作中的 Git 工作流程实践，包括 Git Flow、GitHub Flow 和分支命名规范。',
                'cover' => 'storage/covers/git-workflow.jpg',
                'category_id' => 3,
                'tags' => [7], // Git
                'status' => 'published',
                'is_top' => false,
                'seo_title' => 'Git 工作流程最佳实践 - 版本控制',
                'seo_description' => '介绍团队协作中的 Git 工作流程最佳实践，包括 Git Flow、GitHub Flow 和分支命名规范。',
                'seo_keywords' => 'Git, 工作流程, 版本控制, 团队协作, 分支管理',
            ],
            [
                'title' => 'Docker 容器化部署指南',
                'slug' => 'docker-deployment',
                'content' => '使用 Docker 可以简化应用的部署和运维。本文介绍如何使用 Docker 部署 Laravel 应用。

## Docker 基础
了解 Docker 的基本概念和使用方法。

## Laravel 应用容器化
将 Laravel 应用打包成 Docker 镜像。

## 生产环境部署
使用 Docker Compose 在生产环境中部署应用。',
                'summary' => '使用 Docker 部署 Laravel 应用的完整指南，从基础概念到生产环境部署。',
                'cover' => 'storage/covers/docker-deployment.jpg',
                'category_id' => 4,
                'tags' => [1, 8], // Laravel, Docker
                'status' => 'published',
                'is_top' => true,
                'seo_title' => 'Docker 容器化部署指南 - 运维部署',
                'seo_description' => '完整的 Docker 容器化部署指南，教你如何使用 Docker 部署 Laravel 应用到生产环境。',
                'seo_keywords' => 'Docker, 容器化, 部署, Laravel, 运维',
            ],
            [
                'title' => 'CSS Grid 布局详解',
                'slug' => 'css-grid-layout',
                'content' => 'CSS Grid 是现代网页布局的强大工具。本文详细介绍 Grid 布局的概念和使用方法。

## Grid 容器
设置 Grid 容器和定义网格线。

## Grid 项目
控制 Grid 项目在网格中的位置和大小。

## 响应式布局
使用 Grid 创建响应式布局。',
                'summary' => '掌握 CSS Grid 布局的完整指南，从基础概念到响应式布局实现。',
                'cover' => 'storage/covers/css-grid.jpg',
                'category_id' => 1,
                'tags' => [6], // CSS
                'status' => 'published',
                'is_top' => false,
                'seo_title' => 'CSS Grid 布局详解 - 前端布局',
                'seo_description' => '详细介绍 CSS Grid 布局的概念和使用方法，包括响应式布局的实现。',
                'seo_keywords' => 'CSS Grid, 布局, 前端, 响应式, 网格布局',
            ],
            [
                'title' => '程序员的学习方法',
                'slug' => 'programmer-learning',
                'content' => '在快速发展的技术领域，持续学习是程序员的必备技能。本文分享一些有效的学习方法。

## 学习资源
推荐优质的学习资源和平台。

## 学习方法
分享高效的学习方法和技巧。

## 实践项目
通过实际项目来巩固所学知识。',
                'summary' => '程序员如何高效学习和提升技能，包括学习资源推荐、学习方法和实践项目。',
                'cover' => 'storage/covers/programmer-learning.jpg',
                'category_id' => 2,
                'tags' => [3, 4], // PHP, JavaScript
                'status' => 'published',
                'is_top' => false,
                'seo_title' => '程序员的学习方法 - 职业发展',
                'seo_description' => '分享程序员高效学习的方法和技巧，包括学习资源推荐和实践项目经验。',
                'seo_keywords' => '程序员, 学习方法, 职业发展, 技能提升, 技术学习',
            ],
            [
                'title' => '个人博客系统开发心得',
                'slug' => 'blog-development',
                'content' => '开发个人博客系统的过程中遇到了很多挑战，也学到了很多。本文分享开发过程中的心得体会。

## 技术选型
选择合适的技术栈和框架。

## 功能设计
设计博客系统的核心功能。

## 部署运维
系统的部署和运维经验分享。',
                'summary' => '开发个人博客系统的经验分享，包括技术选型、功能设计和部署运维。',
                'cover' => 'storage/covers/blog-development.jpg',
                'category_id' => 5,
                'tags' => [1, 2, 3], // Laravel, Vue.js, PHP
                'status' => 'published',
                'is_top' => false,
                'seo_title' => '个人博客系统开发心得 - 项目经验',
                'seo_description' => '分享个人博客系统开发的经验和心得，包括技术选型、功能设计和部署运维。',
                'seo_keywords' => '博客系统, 开发经验, Laravel, Vue.js, 项目开发',
            ],
            [
                'title' => '前端性能优化实践',
                'slug' => 'frontend-performance',
                'content' => '前端性能直接影响用户体验。本文分享一些前端性能优化的实践经验和技巧。

## 资源优化
优化图片、CSS、JavaScript 等静态资源。

## 代码优化
优化 JavaScript 代码的执行效率。

## 网络优化
减少网络请求和优化加载策略。',
                'summary' => '前端性能优化的实践经验，包括资源优化、代码优化和网络优化。',
                'cover' => 'storage/covers/frontend-performance.jpg',
                'category_id' => 1,
                'tags' => [2, 4, 6], // Vue.js, JavaScript, CSS
                'status' => 'draft',
                'is_top' => false,
                'seo_title' => '前端性能优化实践 - 性能优化',
                'seo_description' => '分享前端性能优化的实践经验和技巧，包括资源优化、代码优化和网络优化。',
                'seo_keywords' => '前端, 性能优化, JavaScript, CSS, 用户体验',
            ],
            [
                'title' => '微服务架构设计',
                'slug' => 'microservices-architecture',
                'content' => '微服务架构是现代应用开发的重要趋势。本文介绍微服务架构的设计原则和实践经验。

## 架构设计
微服务架构的核心设计原则。

## 服务拆分
如何合理拆分微服务。

## 服务治理
微服务的治理和监控策略。',
                'summary' => '微服务架构的设计原则和实践经验，包括架构设计、服务拆分和服务治理。',
                'cover' => 'storage/covers/microservices.jpg',
                'category_id' => 4,
                'tags' => [1, 8], // Laravel, Docker
                'status' => 'draft',
                'is_top' => false,
                'seo_title' => '微服务架构设计 - 系统架构',
                'seo_description' => '介绍微服务架构的设计原则和实践经验，包括架构设计、服务拆分和服务治理。',
                'seo_keywords' => '微服务, 架构设计, 系统设计, 服务拆分, 服务治理',
            ],
        ];

        foreach ($articles as $articleData) {
            $tags = $articleData['tags'];
            unset($articleData['tags']);
            
            $article = Article::create(array_merge($articleData, [
                'user_id' => $admin->id,
                'view_count' => rand(50, 1000),
                'like_count' => rand(10, 200),
                'published_at' => $articleData['status'] === 'published' ? now()->subDays(rand(1, 30)) : null,
            ]));

            // 关联标签
            $article->tags()->attach($tags);

            // 为已发布的文章创建1-3条评论
            if ($article->status === 'published') {
                $commentCount = rand(1, 3);
                for ($i = 1; $i <= $commentCount; $i++) {
                    Comment::create([
                        'article_id' => $article->id,
                        'user_id' => $admin->id,
                        'content' => "很好的文章，学习了！",
                    ]);
                }
            }
        }

        // 创建6张相册图片
        $photos = [
            [
                'title' => '代码编辑器界面',
                'url' => 'storage/photos/code-editor.jpg',
                'description' => '现代化的代码编辑器界面，支持多种编程语言高亮显示。',
                'alt_text' => '代码编辑器界面截图',
            ],
            [
                'title' => '团队协作场景',
                'url' => 'storage/photos/team-work.jpg',
                'description' => '团队成员正在讨论项目开发方案，体现了良好的协作氛围。',
                'alt_text' => '团队协作讨论场景',
            ],
            [
                'title' => '服务器机房',
                'url' => 'storage/photos/server-room.jpg',
                'description' => '现代化的服务器机房，设备整齐排列，环境整洁。',
                'alt_text' => '服务器机房内部环境',
            ],
            [
                'title' => '开发工作台',
                'url' => 'storage/photos/workspace.jpg',
                'description' => '程序员的开发工作台，配备多显示器和高性能设备。',
                'alt_text' => '程序员开发工作台',
            ],
            [
                'title' => '项目架构图',
                'url' => 'storage/photos/architecture.jpg',
                'description' => '系统架构设计图，展示了清晰的技术架构和模块划分。',
                'alt_text' => '系统架构设计图',
            ],
            [
                'title' => '代码审查会议',
                'url' => 'storage/photos/code-review.jpg',
                'description' => '团队成员正在进行代码审查，确保代码质量和最佳实践。',
                'alt_text' => '代码审查会议场景',
            ],
        ];

        foreach ($photos as $photo) {
            Photo::create($photo);
        }

        // 创建4条留言
        $messages = [
            [
                'guest_name' => '张三',
                'guest_email' => 'zhangsan@example.com',
                'content' => '这个博客写得很好，学到了很多技术知识！',
                'status' => 'approved',
            ],
            [
                'guest_name' => '李四',
                'guest_email' => 'lisi@example.com',
                'content' => '请问博主，Laravel 10 的安装有什么特别要求吗？',
                'status' => 'pending',
            ],
            [
                'guest_name' => '王五',
                'guest_email' => 'wangwu@example.com',
                'content' => 'Vue 3 的 Composition API 确实比 Options API 更灵活，感谢分享！',
                'status' => 'rejected',
            ],
            [
                'guest_name' => '赵六',
                'guest_email' => 'zhaoliu@example.com',
                'content' => '博主的技术文章很有深度，希望能多分享一些实战经验。',
                'status' => 'approved',
            ],
        ];

        $messageIds = [];
        foreach ($messages as $message) {
            $msg = Message::create($message);
            $messageIds[] = $msg->id;
        }

        // 为第一条留言添加一条管理员回复
        $firstMessage = Message::find($messageIds[0]);
        Message::create([
            'guest_name' => '管理员',
            'content' => '感谢您的支持，我会继续分享更多有价值的技术内容！',
            'parent_id' => $firstMessage->id,
            'user_id' => $admin->id,
            'status' => 'approved',
        ]);
    }
}